#include<stdio.h>
#include<malloc.h>
//用链表来实习一个栈
//1.定义一个数据结构
typedef int ElementType;
typedef struct node{
    //1.数据项
    ElementType data;
    //2.地址项
    struct node *next;
}StackNode;
//2.实现函数
//2.1 创建空栈
/*
  函数名：creatStack
  输入：无
  输出：返回创建好的栈 StackNode
*/
StackNode *creatStack(){

    //1.创建一个空栈
    StackNode *stack = malloc(sizeof(StackNode));
    stack->next =NULL;//代表空栈

    return stack;
}
//2.2 插入（从栈顶插入）
/*
   1.将新元素放到新创建的结点里
   2.将新结点指向第一个数据结点
   3.将头结点指向新结点

   函数名：Push
   输入：栈  元素
   输出：int

*/
int Push(StackNode *stack,ElementType data){
    // 1.将新元素放到新创建的结点里
    StackNode *newNode =malloc(sizeof(StackNode));
    newNode->data=data;

    // 2.将新结点指向第一个数据结点
    newNode->next=stack->next;
    // 3.将头结点指向新结点
    stack->next=newNode;
}


//2.3 删除（从栈顶删除）
//1.头结点指向被删除结点的下一个结点
//2.释放被删除结点占用的空间
/*
函数名：Pop()
输入：栈
输出：被删除的元素 ElementType
*/
ElementType Pop(StackNode *stack){
    //1.栈为空，无法删除
    if(stack->next==NULL){
        printf("栈为空，无法删除\n");
        return -1000;//-1000代表不成功
    }
    //2.栈不为空

    StackNode *tmp=stack->next;
    ElementType data =tmp->data;
    stack->next=tmp->next;
    free(tmp);

    return data;
}

int main(){

    //1.创建空栈
    StackNode *stack=creatStack();
    //2.进栈
    ElementType data;
    for(int i =0;i<5;i++){
        scanf("%d",&data);
        Push(stack,data);
    }
    //3.出栈
    Pop(stack);
    Pop(stack);



    return 0;

}